/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package services;

import Entitys.Persona;
import Entitys.ProductoGeneral;
import java.util.List;
import javax.persistence.*;

/**
 *
 * @author MAURO
 */
public class ProductoGeneralServices {
    EntityManagerFactory emf= Persistence.createEntityManagerFactory("DrugStoreProPU");
         EntityManager em=emf.createEntityManager();
         
         public void create (ProductoGeneral p){
          em.getTransaction().begin();
          em.persist(p);
          em.getTransaction().commit();
          em.close();
         }
    
         public void delete (Long   p){
          em.getTransaction().begin();
          ProductoGeneral p1=em.find(ProductoGeneral.class, p);
          if(p1!= null)
          em.remove(p1);
          em.getTransaction().commit();
          em.close();
         }
         //para buscar en todas las droguerías
         public List<ProductoGeneral> ReadAll(){
            Query q=em.createNamedQuery("ProductoGeneral.findAll"); 
            return q.getResultList();
         }
         //para buscar los productos de esta droguería
         public List<Object> InternalReadAll(int idDrugStore){
            Query q=em.createQuery("SELECT p,d,pd From ProductoGeneral p, Drogueria d, ProductoDrogueria pd WHERE p.idProducto= pd.ProductoDrogueriaPK.idProducto AND pd.ProductoDrogueriaPK.idDrogueria=d.idDrogueria AND d.idDrogueria=:iddrogue"); 
            q.setParameter("iddrogue", idDrugStore);
            return q.getResultList();
         }
//         select *  from producto_general,drogueria,producto_drogueria where producto_general.ID_PRODUCTO = producto_drogueria.ID_PRODUCTO and producto_drogueria.ID_DROGUERIA = drogueria.ID_DROGUERIA and drogueria.ID_DROGUERIA = 3
         //this method increases or decreases  the amount in the inventary of a specific product
         //if sum equals true the amount incremets, if false decreases
         public int Update(Long p, Object amount , boolean issum ){
             em.getTransaction().begin();
//             try {
               if(issum){
                    Query q=em.createQuery("UPDATE ProductoGeneral  SET cantidadProducto= cantidadProducto + "+amount+" WHERE idProducto=:idProducto");
//                    q.setParameter(1, amount);
                    q.setParameter("idProducto", p);
                    int updateCount=q.executeUpdate();
                    em.getTransaction().commit();
                    return 0;
               }else{
                    ProductoGeneral pro= em.find(ProductoGeneral.class, p);  
                    if (!(pro.getCantidadProducto()-Integer.parseInt(amount.toString())<0)){
                        Query q=em.createQuery("UPDATE ProductoGeneral  SET cantidadProducto= cantidadProducto - "+amount+" WHERE idProducto=:idProducto");
//                       q.setParameter(1, amount);
                        q.setParameter("idProducto", p);
                        int updateCount=q.executeUpdate();
                        em.getTransaction().commit();
                        return 0;
                       
                    }
               } 
               
//            } catch (javax.persistence.PersistenceException evt) {
//                em.getTransaction().rollback();
//            }finally{
                em.getTransaction().commit();
                return -1;
//            }
             
             
         }
         //lee un producto que coincide con el parámetro id
         public ProductoGeneral ReadById(Long idpr){
             Query q= em.createNamedQuery("ProductoGeneral.findByIdProducto");
             q.setParameter("idProducto", idpr);
             
             return (ProductoGeneral) q.getSingleResult();
         }
         
         public String ReadNameById(Long idpr){
             Query q= em.createQuery("SELECT p.nombreProducto FROM ProductoGeneral p WHERE p.idProducto = :idProducto");
             q.setParameter("idProducto", idpr);
             try {
                 return (String) q.getSingleResult();
             } catch (javax.persistence.NoResultException evt) {
                 System.out.println("Resultado no encontrado");
                 return "";
             }catch(javax.persistence.NonUniqueResultException evt){
                 System.out.println("no es el unico resultado");
                 return (String) q.getResultList().get(1);
             }
             
         }
         
         
         public ProductoGeneral ReadByIdAndName(Long idpr,String nomp){
             Query q=em.createNamedQuery("ProductoGeneral.findByIdProductoNombre");
             q.setParameter("idProducto", idpr);
             q.setParameter("nombreProducto", nomp);
             try {
                 return (ProductoGeneral) q.getSingleResult();
                 
             } catch (javax.persistence.NoResultException e) {
                 System.out.println("Datos no encontrados");
                 return null;
                
             }
             
         }
         
         public List<ProductoGeneral> ReadByName(String nomp){
             Query q=em.createNamedQuery("ProductoGeneral.findByNombreProducto");
             q.setParameter("nombreProducto", nomp);
            try {
                return q.getResultList(); 
             } catch (javax.persistence.NoResultException evt) {
                 System.out.println("resultado no encontrado");
                 return null;
             }
         }
         
         
         // ver linea 63 mucho cuidado
         public List<String> DedicatedQuery(String nom){
             Query q= em.createQuery("SELECT p.nombreProducto FROM ProductoGeneral p "
                                   + "WHERE p.nombreProducto LIKE '"+nom+"%'");
//             q.setParameter("subtring", nom);
             try {
                 return q.getResultList();
             } catch (javax.persistence.NoResultException e) {
                 System.out.println("datos no encontrados");
                 return null;
             }
             
                          
         }
         //retorna solo los nombres de de los productos de la BD in this DrugStore
         public List<String> ReadAllNamesInThisDrugStore(int idDrugStore){
             Query q=em.createQuery("SELECT p.nombreProducto From ProductoGeneral p, Drogueria d, ProductoDrogueria pd WHERE p.idProducto= pd.productoDrogueriaPK.idProducto AND pd.productoDrogueriaPK.idDrogueria=d.idDrogueria AND d.idDrogueria=:iddrogue"); 
             q.setParameter("iddrogue", idDrugStore);
             try {
                return q.getResultList(); 
             } catch (javax.persistence.NoResultException evt) {
                 System.out.println("resultado no encontrado");
                 return null;
             }
             
                          
         }
         //this method brings al the productsnames in the BD
         public List<String> ReadAllNames(){
             Query q= em.createQuery("SELECT p.nombreProducto FROM ProductoGeneral p ");
             try {
                return q.getResultList(); 
             } catch (javax.persistence.NoResultException evt) {
                 System.out.println("resultado no encontrado");
                 return null;
             }
         }    
         
         public Object readIdByName(String nomp){
             Query q= em.createQuery("SELECT p.idProducto FROM ProductoGeneral p WHERE p.nombreProducto = :nombreProducto");
             q.setParameter("nombreProducto", nomp);
             q.setMaxResults(1);
                         
             try {
                return  q.getSingleResult();
             } catch (javax.persistence.NoResultException evt) {
                 System.out.println("resultado no encontrado");
                 return -1;
             }catch(javax.persistence.NonUniqueResultException evt){
                 System.out.println();
                 return q.getResultList().get(1);
             }
         }  
         //this method returns the names of drugstores where the product is avaliable
         public List<String> ReadNamesDrugStoreForSpecificProduct(Long idProduct){
             Query q=em.createQuery("SELECT d.nombreDrogueria From ProductoGeneral p, Drogueria d, ProductoDrogueria pd WHERE pd.productoDrogueriaPK.idDrogueria=d.idDrogueria AND pd.productoDrogueriaPK.idProducto=p.idProducto AND p.idProducto=:idpro"); 
             q.setParameter("idpro", idProduct);
             return q.getResultList();
         }
         
         
         
         
//         public void Update(Long p, Object amount , boolean sum ){
//             em.getTransaction().begin();
////             try {
//               if(sum){
//                      ProductoGeneral pro= em.find(ProductoGeneral.class, p);  
//                        if (pro!=null){
//                            int suma=pro.getCantidadProducto()+Integer.parseInt(amount.toString());
//                            pro.setCantidadProducto(suma);
//                            em.persist(pro);
//                            
//                        }
////                    Query q=em.createQuery("UPDATE ProductoGeneral  SET cantidadProducto= cantidadProducto + "+amount+" WHERE idProducto=:idProducto");
////                    q.setParameter(1, amount);
////                    q.setParameter("idProducto", p);
//               }else{
//                     ProductoGeneral pro= em.find(ProductoGeneral.class, p);  
//                        if (pro!=null){
//                            int suma=pro.getCantidadProducto()-Integer.parseInt(amount.toString());
//                            pro.setCantidadProducto(suma);
//                            em.persist(pro);
//                            
//                        }
//                   
////                    Query q=em.createQuery("UPDATE ProductoGeneral  SET cantidadProducto= cantidadProducto - "+amount+" WHERE idProducto=:idProducto");
////                    q.setParameter(1, amount);
////                    q.setParameter("idProducto", p);
//               }  
////            } catch (javax.persistence.PersistenceException evt) {
////                em.getTransaction().rollback();
////            }finally{
//                em.getTransaction().commit();
//                
////            }
//             
//             
//         }
}
